Racket 循环
for 循环
(for ([i '(1 2 3)])
(display i))
for/list 和 for*/list
感觉有点像 Python 下的 zip,同时遍历多个 list。有两种版本:
for/list:
> (for/list ([i '(1 2 3 4)]
[name '("goodbye" "farewell" "so long")])
(format "~a: ~a" i name))
'("1: goodbye" "2: farewell" "3: so long"
for*/list:
> (for*/list ([i '(1 2 3 4)]
[name '("goodbye" "farewell" "so long")])
(format "~a: ~a" i name))
'("1: goodbye"
"1: farewell"
"1: so long"
"2: goodbye"
"2: farewell"
"2: so long"
"3: goodbye"
"3: farewell"
"3: so long"
"4: goodbye"
"4: farewell"
"4: so long")
for*/list 版本吧所有组合给穷举了。
多列表运算
for/product、for/sum:
> (for/product ([i '(1 2 3)]
[j '(4 5 6)])
(* i j))
720
> (for/sum ([i '(1 2 3)]
[j '(4 5 6)])
(* i j))
32
元素取值
for/first、for/last:
> (for/last ([i '(1 2 3)]
[j '(4 5 6)])
(* i j))
18
多列表转字典
for/hash:
> (for/hash ([i '(1 2 3)]
[j '(4 5 6)])
(values i j))
'#hash((1 . 4) (2 . 5) (3 . 6))
while(True) 等效实现
使用 in-naturals 生成无限序列:
> (for ([i (in-naturals)])
(if (= i 10)
(error "too much!")
(display i)))
123456789
too much!